Tipos
PHP Manual

Cadenas

Un valor string es una serie de caracteres. Antes de PHP 6, un caracter es lo mismo que un byte, es decir, hay exactamente 256 tipos de caracteres diferentes. Esto implica también que PHP no tiene soporte nativo de Unicode. Vea utf8_encode() y utf8_decode() para conocer sobre una funcionalidad básica para Unicode.

Note: El que una cadena se haga muy grande no es un problema. PHP no impone límite práctico alguno sobre el tamaño de las cadenas; el único límite es la memoria disponible en la máquina en la que PHP esté corriendo.

Sintaxis

Un literal tipo string puede especificarse en cuatro formas diferentes.

Comillas simples

La forma más simple de especificar un string es rodearla de comillas simples (el caracter ').

Para especificar una comilla sencilla literal, necesita escaparla con una barra invertida (\). Para especificar una barra invertida literal antes de una comilla sencilla, o al final de la cadena, dóblela (\\). Note que intentar escapar cualquier otro caracter imprimirá la barra invertida también.

Note: A diferencia de las otras dos sintaxis, las variables y secuencias de escape para caracteres especiales no serán expandidas cuando ocurren al interior de cadenas entre comillas sencillas.

<?php
echo 'esta es una cadena simple';

echo 
'También puede tener saltos de línea embebidos
en las cadenas de esta forma, ya que
es válido'
;

// Imprime: Arnold dijo una vez: "I'll be back"
echo 'Arnold dijo una vez: "I\'ll be back"';

// Imprime: Ha eliminado C:\*.*?
echo 'Ha eliminado C:\\*.*?';

// Imprime: Ha eliminado C:\*.*?
echo 'Ha eliminado C:\*.*?';

// Imprime: Esto no va a expandirse: \n una nueva línea
echo 'Esto no va a expandirse: \n una nueva línea';

// Imprime: Las variables no se $expanden $tampoco
echo 'Las variables no se $expanden $tampoco';
?>

Comillas dobles

Si el valor string se encuentra rodeado de comillas dobles ("), PHP interpretará más secuencias de escape para caracteres especiales:

Caracteres escapados
Secuencia Significado
\n alimentación de línea (LF o 0x0A (10) en ASCII)
\r retorno de carro (CR o 0x0D (13) en ASCII)
\t tabulación horizontal (HT o 0x09 (9) en ASCII)
\v tabulación vertical (VT o 0x0B (11) en ASCII) (desde PHP 5.2.5)
\f alimentación de forma (FF o 0x0C (12) en ASCII) (a partir de PHP 5.2.5)
\\ barra invertida
\$ signo de dólar
\" comilla-doble
\[0-7]{1,3} la secuencia de caracteres que coincide con la expresión regular es un caracter en notación octal
\x[0-9A-Fa-f]{1,2} la secuencia de caracteres que coincide con la expresión regular es un caracter en notación hexadecimal

Como ocurre con las cadenas entre comillas sencillas, escapar cualquier otro caracter resultará en que la barra invertida sea impresa también. Antes de PHP 5.1.1, la barra invertida en \{$var} no venía imprimiéndose.

La característica más importante de las cadenas entre comillas dobles es el hecho de que los nombres de variables serán expandidos. Vea procesamiento de cadenas para más detalles.

Heredoc

Una tercera forma de delimitar valores string es mediante el uso de la sintaxis heredoc: <<<. Después de este operador debe indicarse un identificador, luego un salto de línea. La cadena sigue a continuación y luego el mismo identificador de nuevo para cerrar el bloque.

El identificador de cierre debe comenzar en la primera columna de la línea. Asimismo, el identificador usado debe seguir las mismas reglas que cualquier otra etiqueta en PHP: debe contener solo caracteres alfanuméricos y de subrayado, y debe iniciar con un caracter no-dígito o de subrayado.

Warning

Es muy importante notar que la línea con el identificador de cierre no contenga otros caracteres, excepto quizás por un punto-y-coma (;). Esto quiere decir en especial que el identificador no debe usar sangría, y no debe haber espacios o tabuladores antes o después del punto-y-coma. Es importante notar también que el primer caracter antes del identificador de cierre debe ser un salto de línea, tal y como lo defina su sistema operativo. Esto quiere decir \n en sistemas UNIX, incluyendo Mac OS X. El delimitador de cierre (posiblemente seguido de un punto-y-coma) debe ser seguido también por una nueva línea.

Si esta regla es rota y el identificador de cierre no es "limpio", entonces no se considera un identificador de cierre y PHP continuará en busca de uno. Si no se encuentra un identificador de cierre antes del final del archivo actual, un error del analizador sintáctico se producirá en la última línea.

No es posible usar la sintaxis heredoc para inicializar miembros de clase. Use nowdocs en su lugar.

Example #1 Ejemplo inválido

<?php
class foo {
    public 
$bar = <<<EOT
bar
EOT;
}
?>

El texto heredoc se comporta tal como una cadena entre comillas dobles, sin las comillas dobles. Esto quiere decir que no necesita escapar tales comillas en sus bloques heredoc, pero aun puede usar los códigos de escape listados anteriormente. Las variables son expandidas, aunque debe tenerse el mismo cuidado cuando se expresen variables complejas al interior de un segmento heredoc, al igual que con otras cadenas.

Example #2 Ejemplo de uso de una cadena heredoc

<?php
$cadena 
= <<<FIN
Ejemplo de una cadena
que se extiende por varias líneas
usando la sintaxis heredoc.
FIN;

/* Un ejemplo más complejo, con variables. */
class foo
{
    var 
$foo;
    var 
$bar;

    function 
foo()
    {
        
$this->foo 'Foo';
        
$this->bar = array('Bar1''Bar2''Bar3');
    }
}

$foo = new foo();
$nombre 'MiNombre';

echo <<<FIN
Mi nombre es "$nombre". Estoy imprimiendo algo de $foo->foo.
Ahora, estoy imprimiendo algo de 
{$foo->bar[1]}.
Esto debería imprimir una letra 'A' mayúscula: \x41
FIN;
?>

El resultado del ejemplo seria:

Mi nombre es "MiNombre". Estoy imprimiendo algo de Foo.
Ahora, estoy imprimiendo algo de Bar2.
Esto debería imprimir una letra 'A' mayúscula: A

Note: El soporte heredoc fue agregado en PHP 4.

Nowdoc

Nowdocs es para las cadenas en comillas sencillas lo que heredocs es para las cadenas en comillas dobles. Un nowdoc es especificado de forma similar a heredoc, pero no se realiza ningún procesamiento al interior de un nowdoc. Esta construcción es ideal para embeber código PHP u otros bloques grandes de texto sin la necesidad de escaparlo. Comparte algunas características en común con la construcción de SGML <![CDATA[ ]]>, en el sentido de que declara un bloque de texto que no debe ser procesado.

Un nowdoc es identificado con la misma secuencia <<< usada para heredocs, pero el identificador que sigue a continuación debe ser rodeado de comillas sencillas, p.ej. <<<'FIN'. Todas las reglas para los identificadores heredoc también se aplican a los identificadores nowdoc, especialmente aquellas relacionadas con la apariencia del identificador de cierre.

Example #3 Ejemplo de uso de una cadena nowdoc

<?php
$cadena 
= <<<'FIN'
Ejemplo de una cadena
que se extiende por varias líneas
usando la sintaxis nowdoc.
FIN;

/* Un ejemplo más complejo, con variables. */
class foo
{
    var 
$foo;
    var 
$bar;

    function 
foo()
    {
        
$this->foo 'Foo';
        
$this->bar = array('Bar1''Bar2''Bar3');
    }
}

$foo = new foo();
$nombre 'MiNombre';

echo <<<'FIN'
Mi nombre es "$nombre". Estoy imprimiendo algo de $foo->foo.
Ahora, estoy imprimiendo algo de {$foo->bar[1]}.
Esto no debería imprimir una letra 'A' mayúscula: \x41
FIN;
?>

El resultado del ejemplo seria:

Mi nombre es "$nombre". Estoy imprimiendo algo de $foo->foo.
Ahora, estoy imprimiendo algo de {$foo->bar[1]}.
Esto no debería imprimir una letra 'A' mayúscula: \x41

Note: A diferencia de los bloques heredoc, nowdocs pueden ser usados en cualquier contexto de datos estáticos. El ejemplo típico es la inicialización de miembros o constantes de clase:

Example #4 Ejemplo de datos estáticos

<?php
class foo {
    public 
$bar = <<<'EOT'
bar
EOT;
}
?>

Note: El soporte para nowdoc fue agregado en PHP 5.3.0.

Procesamiento de variables

Cuando un valor string es especificado en comillas dobles o al interior de un bloque heredoc, las variables son interpretadas en su interior.

Existen dos tipos de sintaxis: una simple y una compleja. La sintaxis simple es la más común y conveniente. Ésta ofrece una forma de interpretar una variable, un valor array, o una propiedad de un objeto al interior de una cadena con un mínimo de esfuerzo.

La sintaxis compleja fue introducida en PHP 4, y puede reconocerse por las llaves que rodean la expresión.

Sintaxis simple

Si un signo de dólar ($) es encontrado, el analizador sintáctico tomará ambiciosamente tantos lexemas como le sea posible para formar un nombre de variable válido. Rodee el nombre de la variable de llaves si desea especificar explícitamente el final del nombre.

<?php
$cerveza 
'Heineken';
echo 
"El sabor de varias $cerveza's es excelente"// funciona, "'" no es un caracter válido para nombres de variables
echo "Tomó algunas $cervezas";   // no funciona, 's' es un caracter válido para nombres de variables
echo "Tomó algunas ${cerveza}s"// funciona
echo "Tomó algunas {$cerveza}s"// funciona
?>

De forma similar, el índice de un array o una propiedad de un object pueden ser interpretados. En el caso de los índices de matrices, el corchete cuadrado de cierre (]) marca el final del índice. Las mismas reglas usadas con variables simples se aplican a las propiedades de objetos.

<?php
// Estos ejemplos son específicos al uso de matrices al interior de
// cadenas. Cuando se encuentre por fuera de una cadena, siempre rodee
// de comillas las claves tipo cadena de su matriz, y no use {llaves}.

// Mostrar todos los errores
error_reporting(E_ALL);

$frutas = array('fresa' => 'roja''banano' => 'amarillo');

// Funciona pero note que esto trabaja de forma diferente por fuera de
// cadenas entre comillas
echo "Un banano es $frutas[banano].";

// Funciona
echo "Un banano es {$frutas['banano']}.";

// Funciona, pero PHP busca una constante llamada banano primero, como
// se describe más adelante.
echo "Un banano es {$frutas[banano]}.";

// No funciona, use llaves. Esto resulta en un error de análisis sintáctico.
echo "Un banano es $frutas['banano'].";

// Funciona
echo "Un banano es " $frutas['banano'] . ".";

// Funciona
echo "Este cuadro tiene $cuadro->ancho metros de ancho.";

// No funciona. Para una solución, vea la sintaxis compleja.
echo "Este cuadro tiene $cuadro->ancho00 centímetros de ancho.";
?>

Para cualquier cosa más sofisticada, debería usarse la sintaxis compleja.

Sintaxis compleja (llaves)

Esta no es llamada compleja porque la sintaxis sea compleja, sino porque es posible incluir expresiones complejas de esta forma.

De hecho, cualquier valor que sea parte del espacio de nombres puede ser incluido en una cadena con esta sintaxis. Simplemente escriba la expresión en la misma forma que lo haría si se encontrara por fuera de una cadena, y luego la ubica entre { y }. Ya que no es posible escapar {, esta sintaxis será reconocida únicamente cuando el caracter $ se encuentra inmediatamente después de {. Use {\$ para obtener una secuencia literal {$. Algunos ejemplos para aclarar el asunto:

<?php
// Mostrar todos los errores
error_reporting(E_ALL);

$genial 'fantástico';

// No funciona, imprime: Esto es { fantástico}
echo "Esto es { $genial}";

// Funciona, imprime: Esto es fantástico
echo "Esto es {$genial}";
echo 
"Esto es ${genial}";

// Funciona
echo "Este cuadro tiene {$cuadro->ancho}00 centímetros de ancho.";

// Funciona
echo "Esto funciona: {$matriz[4][3]}";

// Esto está mal por la misma razón por la que $foo[bar] está mal por
// fuera de una cadena. En otras palabras, aun funciona pero sólo porque
// PHP busca primero una constante llamada foo; genera un error de
// nivel E_NOTICE (constante indefinida).
echo "Esto está mal: {$matriz[foo][3]}";

// Funciona. Cuando se usan matrices multi-dimensionales, use siempre
// llaves alrededor de las matrices al interior de cadenas
echo "Esto funciona: {$matriz['foo'][3]}";

// Funciona.
echo "Esto funciona: " $arr['foo'][3];

echo 
"Esto funciona también: {$obj->valores[3]->nombre}";

echo 
"Este es el valor de la variable llamada $nombre{${$nombre}}";

echo 
"Este es el valor de la variable llamada por el valor devuelto por getName(): {${getName()}}";

echo 
"Este es el valor de la variable llamada por el valor devuelto por \$objeto->getName(): {${$objeto->getName()}}";
?>

Note: Las llamadas a funciones y métodos al interior de {$} trabajan a partir de PHP 5.

Acceso a cadenas y modificación por caracter

Los caracteres al interior de una cadena pueden ser consultados y modificados al especificar el desplazamiento, comenzando en cero, del caracter deseado después de la cadena usando corchetes cuadrados tipo-matriz como $cadena[42]. Para este propósito, piense en un valor string como un array de caracteres.

Note: Las cadenas son accesibles también usando llaves, como en $cadena{42}, para el mismo propósito. Sin embargo, esta sintaxis ha sido marcada como obsoleta en PHP 6. Use los corchetes cuadrados en su lugar.

Example #5 Algunos ejemplos de cadenas

<?php
// Obtener el primer caracter de una cadena
$cadena 'Esta es una prueba.';
$primer $cadena[0];

// Obtener el tercer caracter de una cadena
$tercer $cadena[2];

// Obtener el último caracter de una cadena.
$cadena 'Esta es también una prueba.';
$ultimo $cadena[strlen($cadena)-1];

// Modificar el último caracter de una cadena
$cadena 'Observe el mar';
$cadena[strlen($cadena)-1] = 'l';

?>

Note: Al accesar variables de otros tipos mediante [] o {} se devuelve silenciosamente NULL.

Funciones y operadores útiles

Las cadenas pueden ser concatenadas usando el operador '.' (punto). Note que el operador '+' (adición) no funciona para este propósito. Por favor refiérase a la sección Operadores de cadena para más información.

Existen bastantes funciones útiles para la modificación de valores string.

Vea la sección de funciones de cadena para consultar funciones de uso general, y las funciones de expresiones regulares o las funciones de expresiones regulares compatibles con Perl para funcionalidad avanzada de búsquedas y reemplazos.

Existen también funciones para cadenas tipo URL, y funciones para encriptar/descifrar cadenas (mcrypt y mhash).

Finalmente, vea también las funciones de tipo de caracter.

Conversión a cadena

Un valor puede ser convertido a string usando el moldeamiento (string) o la función strval(). La conversión a cadena se realiza automáticamente en el ámbito de una expresión cuando se necesita una cadena. Esto ocurre cuando usa las funciones echo() o print(), o cuando una variable es comparada con una cadena. El contenido de las secciones del manual sobre Tipos y Manipulación de Tipos ayudan a aclarar el contenido presentado a continuación. Vea también la función settype().

Un valor boolean TRUE es convertido a la cadena "1", el valor FALSE se representa como "" (la cadena vacía). De esta forma, usted puede convertir de ida y vuelta entre valores booleanos y de cadena.

Un número integer o de punto flotante (float) es convertido a una cadena que representa el número textualmente (incluyendo la parte del exponente para los números de punto flotante). Los números de punto flotante pueden ser convertidos usando la notación exponencial (4.1E+6).

Note: El caracter de punto decimal es definido en la localización del script (categoría LC_NUMERIC). Vea la función setlocale().

Las matrices son siempre convertidas a la cadena "Array"; por esta razón, echo() y print() no pueden por su cuenta mostrar los contenidos de un valor array. Para ver un elemento sencillo, use una construcción como echo $arr['foo']. Vea más adelante algunos consejos sobre el volcado/vista del contenido completo.

Los objetos en PHP 4 son convertidos siempre a la cadena "Object". Para imprimir los valores de miembros de un objeto para efectos de depuración, lea los parágrafos siguientes. Para obtener el nombre de la clase de un objeto, use la función get_class(). A partir de PHP 5, el método __toString es usado si resulta aplicable.

Los recursos son siempre convertidos a cadenas con la estructura "Resource id #1" en donde 1 es el número único del valor resource asignado por PHP en tiempo de ejecución. No escriba código que dependa de esta estructura; está sujeta a cambios. Para obtener el tipo del recurso, use la función get_resource_type().

NULL se convierte siempre a una cadena vacía.

Como se ha indicado anteriormente , convertir directamente un valor tipo array, object, o resource a un string no ofrece información útil sobre los valores más allá de su tipo. Consulte las funciones print_r() y var_dump() para conocer mejores formas de inspeccionar los contenidos de estos tipos.

La mayoría de valores PHP pueden ser convertidos también a string para su almacenamiento permanentemente. Este método es conocido como seriación, y es efectuado por la función serialize(). Si el motor PHP fue compilado con soporte WDDX, los valores PHP pueden ser seriados también como texto XML correctamente formado.

Conversión de cadenas a números

Cuando una cadena es evaluada en un ámbito numérico, el valor resultante y su tipo son determinados como sigue.

El valor string será evaluado como un float si contiene cualquier caracter entre '.', 'e', o 'E'. De otra forma, será evaluado como un integer.

El valor es dado por la porción inicial de la cadena. Si la cadena comienza con datos numéricos válidos, éstos serán el valor usado. De lo contrario, el valor será 0 (cero). Un dato numérico válido consiste de un signo opcional, seguido por uno o más dígitos (que pueden contener un punto decimal), seguidos por un exponente opcional. El exponente es una 'e' o 'E' seguida de uno o más dígitos.

<?php
$foo 
"10.5";                // $foo es flotante (11.5)
$foo "-1.3e3";              // $foo es flotante (-1299)
$foo "bob-1.3e3";           // $foo es entero (1)
$foo "bob3";                // $foo es entero (1)
$foo "10 Cerditos";         // $foo es entero (11)
$foo "10.2 Cerditos";       // $foo es flotante (14.2)
$foo "10.0 cerdos " 1;        // $foo es flotante (11)
$foo "10.0 cerdos " 1.0;      // $foo es flotante (11)
?>

Para más información sobre esta conversión, vea la página del manual Unix sobre strtod(3).

Si quisiera probar cualquiera de los ejemplos presentados en esta sección, puede cortar y pegar los ejemplos e insertar la siguiente línea para verificar por sí mismo lo que está sucediendo:

<?php
echo "\$foo==$foo; tipo es " gettype ($foo) . "<br />\n";
?>

No espere obtener el código de un caractar convirtiéndolo a un entero, como se hace en C. Use las funciones ord() y chr() para convertir entre códigos ASCII y caracteres.


Tipos
PHP Manual